package com.xzcedu.reflection.question;

import com.xzcedu.Cat;

import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * @author 徐州城
 * @version 1.0
 * 反射问题的引入
 */
@SuppressWarnings("all")
public class ReflectionQuestion {
    public static void main(String[] args) throws Exception {
        //根据配置文件 re.properties 指定信息，创建对象并调用方法
        //回忆

        //传统的方式 new 对象 -> 调用方法
//        Cat cat = new Cat();
//        cat.hi();

        //我们尝试做一做 -> 明白反射
        //1. 使用Properties 类，可以读写配置文件
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\re.properties"));
        String classfullpath = properties.get("classfullpath").toString();//"com.xzcedu.Cat"
        String methodName = properties.get("method").toString();

        System.out.println("classfullpath=" + classfullpath);
        System.out.println("method=" + methodName);

        //2. 创建一个对象，传统方法解决不了 行不通 -> 反射机制
        //new classfullpath();

        //3. 使用反射机制解决
        //(1) 加载类 返回一个Class类型的对象
        Class cls = Class.forName(classfullpath);
        //(2) 通过 cls 得到你加载的类 com.xzcedu.Cat 的对象实例
        Object o = cls.newInstance();
        System.out.println("o的运行类型=" + o.getClass());
        //(3) 通过 cls 得到你加载的类 com.xzcedu.Cat 的 methodName"hi" 的方法对象
        //    即：在反射中，可以把方法视为对象（万物皆对象）
        Method method = cls.getMethod(methodName);
        //(4) 通过method 调用方法: 即通过方法对象调用方法
        System.out.println("=============");
        method.invoke(o);//传统方法 对象.方法(), 反射机制 方法.invoke(对象)

    }
}
